package 案例.生产消费;

/**
 * 食物类
 * <p>
 * 用来表示生成的、可以消费的食物
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/7/6 下午8:10
 */
public class Food {

    /**
     * 食品名称
     */
    private String name;

    /**
     * 用来单独处理食物的状态
     */
    private boolean flag = true;

    /**
     * 厨子生产产品
     *
     * @param name 名称
     */
    public synchronized void createFood(String name) {
        if (!flag) {
            try {
                /**
                 * 通过父类调用，线程的等待方法
                 *  此方法表示当前线程释放所有对象锁，进行阻塞状态，不能自动执行，要等待别人唤醒
                 *  这就是一个睡美人（等待他的王子）
                 */
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.setName(name);
        //开启食物状态
        flag = false;

        /**
         * 进入线程等待队列当中随机找一个人来唤醒，执行唤醒的线程
         * 这个方法我们可以想像成为王子。
         * 针对于题的话我们就是唤醒服务员上菜
         */
        this.notify();
    }

    /**
     * 消费食物
     */
    public synchronized void consumerFood() {
        if (flag) {
            /**
             * 如果没有菜不能上菜处理
             */
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.printf(Thread.currentThread().getName()+"您好，这是您点的菜%s\n", this.getName()+"id"+Thread.currentThread().getId());
        flag = true;
        this.notify();
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
